package beans;

import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;
import org.richfaces.component.html.HtmlDataTable;

import co.edu.uniquindio.ondas.delegados.AdministradorDelegado;
import co.edu.uniquindio.ondas.entidades.Institucion;

/**
 * @author Javier
 *Bean para la Institucion
 */
public class InstitucionBean{
	
	private AdministradorDelegado administradorDelegado;
	
	
	/**
	 * Tabla para listar las intituciones registradas en el sistema
	 */
	private HtmlDataTable myDataTable;
    private Institucion institucionSeleccionada = new Institucion();
    private Institucion nuevaInstitucion=new Institucion();
    
    private List<String> listaZonas;
    private List<String>listaMunicipios;
    private List<String>listaNombres=new ArrayList<String>();
    public List<Institucion>instituciones;
    
    private String nombreMunicipio;
    private String municipioSel="";
    private String institucionSel="";
    private String zonaSel="";
    
    private boolean consulta=false;
    private boolean intitucionCreada=false;
    private boolean intitucionEditada=false;
    
    /**
     * Constante para la paginacion de instituciones
     */
    public static final int TAM_PAGINA=10;
    
    private int paginaActual;
	private long totalPaginas;
    
	/**
	 * Metodo que permite crear una intitucion desde interfaz
	 * @return
	 */
	public String crearInstitucion()
	{
		intitucionCreada=administradorDelegado.crearIntitucion(nuevaInstitucion, municipioSel, zonaSel);
		if (intitucionCreada) {
			nuevaInstitucion=new Institucion();
			municipioSel=new String();
			zonaSel=new String();
		}
		return "";
	}

    
    /**
     * Metodo que permite editar 
     * @return
     * @throws NamingException
     */
    public String editMyData() throws NamingException {
    	
    	administradorDelegado=new AdministradorDelegado();
    	listaMunicipios=administradorDelegado.getListaMunicipios();
        // Obtener el elemento MyData para editarlo
    	institucionSeleccionada = (Institucion) getMyDataTable().getRowData();
    	nombreMunicipio=institucionSeleccionada.getMunicipio().getNombre();
    	listaZonas=administradorDelegado.getListaZonas();
//        JOptionPane.showMessageDialog(null, institucionSeleccionada.getMunicipio().getNombre());
        return "edit"; // Navega hacia edit
    }
    
    /**
     * Metodo que permite obtener una lista de municipios
     * @return "nuevaInstitucion"
     * @throws NamingException
     */
    public String listaMunicipios() throws NamingException
	{
    	administradorDelegado=new AdministradorDelegado();
    	listaMunicipios=administradorDelegado.getListaMunicipios();
    	listaZonas=administradorDelegado.getListaZonas();
		
		return "nuevaInstitucion";
	}
    
    /**
     * Metodo que permite obtener una lista de instituciones
     * @return "editarInstitucion"
     * @throws NamingException
     */
    public String obtenerListaInstituciones() throws NamingException
	{
    	administradorDelegado=new AdministradorDelegado();
		listaNombres=administradorDelegado.getListaInstituciones();
		listaMunicipios=administradorDelegado.getListaMunicipios();
		listaZonas=administradorDelegado.getListaZonas();
		instituciones=new ArrayList<Institucion>();
		municipioSel=new String();
		zonaSel=new String();
		institucionSel=new String();
		
		return "editarInstitucion";
	}
    
    /**
     * Metodo que permite editar una Institcion
     * @return
     * @throws NamingException
     */
    public String editarInstitucion() throws NamingException
    {
    	administradorDelegado=new AdministradorDelegado();
    	
    	intitucionEditada=administradorDelegado.editarIntitucion(institucionSeleccionada, nombreMunicipio, zonaSel);
    	if (intitucionEditada) {
			nombreMunicipio=new String();
			zonaSel=new String();
		}
    	
    	return buscarInstitucion();
    }
    
    /**
     * Metodo que permite obtener los municipios que tienen asignados una investigacion
     * @return
     * @throws NamingException
     */
    public String obtenerInMuni() throws NamingException
    {
    	administradorDelegado=new AdministradorDelegado();
    	
    	if (municipioSel.equals("")) {
			listaNombres=administradorDelegado.getListaInstituciones();
		}
    	else
    		listaNombres=administradorDelegado.getListaNombresInstituciones(municipioSel, zonaSel);
    	return "";
    }
    
    /**
     * Metodo que permite realizar una consulta pagina de las instituciones registradas en el sistema
     * @return
     * @throws NamingException
     */
    public String buscarInstitucion() throws NamingException
    {
    	administradorDelegado=new AdministradorDelegado();
    	
    	totalPaginas =administradorDelegado.obtenerTotalPaginasIntituciones(TAM_PAGINA, municipioSel, institucionSel, zonaSel);
    	
    	if (totalPaginas >= 0) {
			paginaActual=1;
			instituciones = administradorDelegado.obtenerPaginaIntituciones(paginaActual, TAM_PAGINA, municipioSel, institucionSel, zonaSel);
		}
    	
    	consulta=true;
    	return "";
    }
    
    /**
     * Metodo que permite redireccionar a la pagina siguiente de una consulta paginada
     * @return
     */
    public String paginaSiguiente()
	{
		if (paginaActual < totalPaginas) {
			paginaActual+=1;
			instituciones = administradorDelegado.obtenerPaginaIntituciones(paginaActual, TAM_PAGINA, municipioSel, institucionSel, zonaSel);
		}
		return "";
	}
	
	/**
	 * Metodo que permite devolverse a la pagina anterior en una consulta paginada
	 * @return
	 */
	public String paginaAnterior()
	{
		if (paginaActual > 1) {
			paginaActual-=1;
			instituciones = administradorDelegado.obtenerPaginaIntituciones(paginaActual, TAM_PAGINA, municipioSel, institucionSel, zonaSel);
		}
		return "";
	}


	/**
	 *Metodo accesor del atributo administradorDelegado
	 * @return the administradorDelegado
	 */
	public AdministradorDelegado getAdministradorDelegado() {
		return administradorDelegado;
	}


	/**
	 *Metodo Modificador del atributo administradorDelegado
	 * @param administradorDelegado the administradorDelegado to set
	 */
	public void setAdministradorDelegado(AdministradorDelegado administradorDelegado) {
		this.administradorDelegado = administradorDelegado;
	}


	/**
	 *Metodo accesor del atributo myDataTable
	 * @return the myDataTable
	 */
	public HtmlDataTable getMyDataTable() {
		return myDataTable;
	}


	/**
	 *Metodo Modificador del atributo myDataTable
	 * @param myDataTable the myDataTable to set
	 */
	public void setMyDataTable(HtmlDataTable myDataTable) {
		this.myDataTable = myDataTable;
	}


	/**
	 *Metodo accesor del atributo institucionSeleccionada
	 * @return the institucionSeleccionada
	 */
	public Institucion getInstitucionSeleccionada() {
		return institucionSeleccionada;
	}


	/**
	 *Metodo Modificador del atributo institucionSeleccionada
	 * @param institucionSeleccionada the institucionSeleccionada to set
	 */
	public void setInstitucionSeleccionada(Institucion institucionSeleccionada) {
		this.institucionSeleccionada = institucionSeleccionada;
	}


	/**
	 *Metodo accesor del atributo nuevaInstitucion
	 * @return the nuevaInstitucion
	 */
	public Institucion getNuevaInstitucion() {
		return nuevaInstitucion;
	}


	/**
	 *Metodo Modificador del atributo nuevaInstitucion
	 * @param nuevaInstitucion the nuevaInstitucion to set
	 */
	public void setNuevaInstitucion(Institucion nuevaInstitucion) {
		this.nuevaInstitucion = nuevaInstitucion;
	}


	/**
	 *Metodo accesor del atributo listaZonas
	 * @return the listaZonas
	 */
	public List<String> getListaZonas() {
		return listaZonas;
	}


	/**
	 *Metodo Modificador del atributo listaZonas
	 * @param listaZonas the listaZonas to set
	 */
	public void setListaZonas(List<String> listaZonas) {
		this.listaZonas = listaZonas;
	}


	/**
	 *Metodo accesor del atributo listaMunicipios
	 * @return the listaMunicipios
	 */
	public List<String> getListaMunicipios() {
		return listaMunicipios;
	}


	/**
	 *Metodo Modificador del atributo listaMunicipios
	 * @param listaMunicipios the listaMunicipios to set
	 */
	public void setListaMunicipios(List<String> listaMunicipios) {
		this.listaMunicipios = listaMunicipios;
	}


	/**
	 *Metodo accesor del atributo listaNombres
	 * @return the listaNombres
	 */
	public List<String> getListaNombres() {
		return listaNombres;
	}


	/**
	 *Metodo Modificador del atributo listaNombres
	 * @param listaNombres the listaNombres to set
	 */
	public void setListaNombres(List<String> listaNombres) {
		this.listaNombres = listaNombres;
	}


	/**
	 *Metodo accesor del atributo instituciones
	 * @return the instituciones
	 */
	public List<Institucion> getInstituciones() {
		return instituciones;
	}


	/**
	 *Metodo Modificador del atributo instituciones
	 * @param instituciones the instituciones to set
	 */
	public void setInstituciones(List<Institucion> instituciones) {
		this.instituciones = instituciones;
	}


	/**
	 *Metodo accesor del atributo nombreMunicipio
	 * @return the nombreMunicipio
	 */
	public String getNombreMunicipio() {
		return nombreMunicipio;
	}


	/**
	 *Metodo Modificador del atributo nombreMunicipio
	 * @param nombreMunicipio the nombreMunicipio to set
	 */
	public void setNombreMunicipio(String nombreMunicipio) {
		this.nombreMunicipio = nombreMunicipio;
	}


	/**
	 *Metodo accesor del atributo municipioSel
	 * @return the municipioSel
	 */
	public String getMunicipioSel() {
		return municipioSel;
	}


	/**
	 *Metodo Modificador del atributo municipioSel
	 * @param municipioSel the municipioSel to set
	 */
	public void setMunicipioSel(String municipioSel) {
		this.municipioSel = municipioSel;
	}


	/**
	 *Metodo accesor del atributo institucionSel
	 * @return the institucionSel
	 */
	public String getInstitucionSel() {
		return institucionSel;
	}


	/**
	 *Metodo Modificador del atributo institucionSel
	 * @param institucionSel the institucionSel to set
	 */
	public void setInstitucionSel(String institucionSel) {
		this.institucionSel = institucionSel;
	}


	/**
	 *Metodo accesor del atributo zonaSel
	 * @return the zonaSel
	 */
	public String getZonaSel() {
		return zonaSel;
	}


	/**
	 *Metodo Modificador del atributo zonaSel
	 * @param zonaSel the zonaSel to set
	 */
	public void setZonaSel(String zonaSel) {
		this.zonaSel = zonaSel;
	}


	/**
	 *Metodo accesor del atributo consulta
	 * @return the consulta
	 */
	public boolean isConsulta() {
		return consulta;
	}


	/**
	 *Metodo Modificador del atributo consulta
	 * @param consulta the consulta to set
	 */
	public void setConsulta(boolean consulta) {
		this.consulta = consulta;
	}


	/**
	 *Metodo accesor del atributo intitucionCreada
	 * @return the intitucionCreada
	 */
	public boolean isIntitucionCreada() {
		return intitucionCreada;
	}


	/**
	 *Metodo Modificador del atributo intitucionCreada
	 * @param intitucionCreada the intitucionCreada to set
	 */
	public void setIntitucionCreada(boolean intitucionCreada) {
		this.intitucionCreada = intitucionCreada;
	}


	/**
	 *Metodo accesor del atributo intitucionEditada
	 * @return the intitucionEditada
	 */
	public boolean isIntitucionEditada() {
		return intitucionEditada;
	}


	/**
	 *Metodo Modificador del atributo intitucionEditada
	 * @param intitucionEditada the intitucionEditada to set
	 */
	public void setIntitucionEditada(boolean intitucionEditada) {
		this.intitucionEditada = intitucionEditada;
	}


	/**
	 *Metodo accesor del atributo paginaActual
	 * @return the paginaActual
	 */
	public int getPaginaActual() {
		return paginaActual;
	}


	/**
	 *Metodo Modificador del atributo paginaActual
	 * @param paginaActual the paginaActual to set
	 */
	public void setPaginaActual(int paginaActual) {
		this.paginaActual = paginaActual;
	}


	/**
	 *Metodo accesor del atributo totalPaginas
	 * @return the totalPaginas
	 */
	public long getTotalPaginas() {
		return totalPaginas;
	}


	/**
	 *Metodo Modificador del atributo totalPaginas
	 * @param totalPaginas the totalPaginas to set
	 */
	public void setTotalPaginas(long totalPaginas) {
		this.totalPaginas = totalPaginas;
	}

	
	
}
